﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>

//字符分类函数


//写⼀个代码，将字符串中的⼩写字⺟转⼤写，其他字符不变。
#include <ctype.h>
//int main()
//{
//	int i = 0;
//	char str[] = "Test String.\n";
//	char c;
//	while (str[i])
//	{
//		c = str[i];
//		if (islower(c))
//			c -= 32;
//		putchar(c);
//		i++;
//	}
//	return 0;
//}


//字符转换函数


//写⼀个代码，将字符串中的⼩写字⺟转⼤写，其他字符不变。
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c = toupper(c);
		putchar(c);
		i++;
	}
	return 0;
}



//字符串函数
//理解使用strlen, strcpy, strcat, strcmp, strstr 库函数及模拟实现
//理解使用strncpy, strncat, strncmp , strtok , strerror 库函数


//strlen模拟实现
//size_t my_strlen(const char* str)
//{
//	size_t count = 0;
//	assert(str);
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

/*size_t my_strlen(const char* str)
{
	assert(str);
	const char* start = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - start;
}*/

/*size_t my_strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
*/
//int main()
//{
//	char arr[] = "abcdef";
//	size_t ret = my_strlen(arr);
//	printf("%zd\n", ret);
//
//	return 0;
//}

//strcpy模拟实现
//void my_strcpy(char* dest, char* scr)
//{
//	char* ret = dest;
//	while (*scr != '\0')
//	{
//		*dest = *scr;
//		dest++;
//		scr++;
//	}
//	*dest = *scr;
//}
//char* my_strcpy(char* dest, char* scr)
//{
//	assert(dest && scr);
//	char* ret = dest;
//	while (*dest++ = *scr++)
//		;
//	return ret;
//	
//}
//
//int main()
//{
//	char arr1[20] = { 0 };
//	char arr2[] = "HelloWorld";
//	my_strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//
//	return 0;
//}

//strcat模拟实现
//char* my_strcat(char* dest, const char* scr)
//{
//	char* ret = dest;
//	assert(dest && scr);
//	//找到目标下的'\0'
//	while (*dest)
//		dest++;
//	//拷贝
//	while (*dest++ = *scr++)
//		;
//
//	return ret;
//}
//int main()
//{
//	char arr1[20] = "Hello ";
//	char arr2[] = "world!";
//	my_strcat(arr1, arr2);
//	printf("%s\n", arr1);
//
//	return 0;
//}

//strcmp的模拟实现
//int my_strcmp(const char* s1, const char* s2)
//{
//	while (*s1 == *s2)
//	{
//		if (*s1 == '\0')
//			return 0;
//		s1++;
//		s2++;
//	}
//	if (*s1 > *s2)
//		return 1;
//	else
//		return -1;
//}
//
//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[] = "abqc";
//	int ret = my_strcmp(arr1, arr2);
//	if (ret > 0)
//		printf("大于\n");
//	else if (ret == 0)
//		printf("等于\n");
//	else
//		printf("小于\n");
//
//	return 0;
//}

//strncpy的理解
//int main()
//{
//	char arr1[20] = "xxxxxxxxx";
//	char arr2[] = "Hello";
//	strncpy(arr1, arr2,4);
//	return 0;
//}

//strncat的理解
//int main()
//{
//	char arr1[20] = "xxxxx";
//	char arr2[] = "abcq";
//	strncat(arr1, arr2, 3);
//	printf("%s\n", arr1);
//
//	return 0;
//}

//strncmp的理解
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "abcq";
//	int ret = strncmp(arr1, arr2, 4);
//	printf("%d\n", ret);
//
//	return 0;
//}


//strstr的理解
//int main()
//{
//	char str1[] = "abcdef";
//	char str2[] = "bcdg";
//	char* ret = strstr(str1, str2);
//	if (ret != NULL)
//		printf("%s\n", ret);
//	else
//		printf("找不到\n");
//	return 0;
//}

//暴力求解
//strstr模拟实现
//char* my_strstr(const char* str1, const char* str2)
//{
//	const char* cur = str1;
//	const char* s1 = NULL;
//	const char* s2 = NULL;
//	assert(str1 && str2);
//	if (*str2 == '\0')
//		return (char*)str1;
//	while (*cur)
//	{
//		s1 = cur;
//		s2 = str2;
//		while (*s1 && *s2 && *s1 == *s2)
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//			return (char*)cur;
//		cur++;
//	}
//
//	return NULL;
//}
//int main()
//{
//	char str1[] = "abcdef";
//	char str2[] = "bcdg";
//	char* ret = my_strstr(str1, str2);
//	if (ret != NULL)
//		printf("%s\n", ret);
//	else
//		printf("找不到\n");
//	return 0;
//}


//strtok的理解
//int main()
//{
//	char str1[] = "zhangpeng@234.com#hehe&aaa";
//	char str2[50] = { 0 };
//	strcpy(str2, str1);
//	const char* p = "@.#&";
//	char* s = NULL;
//	for (s = strtok(str2, p); s != NULL; s = strtok(NULL, p))
//	{
//		printf("%s\n", s);
//	}
//	return 0;
//}

//strerror的理解
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d:%s\n", i, strerror(i));
//	}
//	return 0;
//}

//#include <errno.h>
//int main()
//{
//	FILE* pFile;
//	pFile = fopen("unexist.ent", "r");
//	if (pFile == NULL)
//		printf("Error opening file unexist.ent: %s\n", strerror(errno));
//	return 0;
//}

//perror
//#include <errno.h>
//int main()
//{
//	FILE* pFile;
//	pFile = fopen("unexist.ent", "r");
//	if (pFile == NULL)
//		perror("Error opening file unexist.ent");
//	return 0;
//}



//内存函数
// 理解使用memcpy , memmove 函数以及模拟实现
// 理解使用memset , memcmp 函数



//memcpy的使用与模拟
//不可以处理重叠的部分
// void * memcpy ( void * destination, const void * source, size_t num );

//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	memcpy(arr2, arr1 + 3, 5 * sizeof(int));
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

//void* my_memcpy(void* dest, const void* src, size_t count)
//{
//	void* ret = dest;
//	assert(dest);
//	assert(src);
//	
//	while (count--) {
//		*(char*)dest = *(char*)src;
//		dest = (char*)dest + 1;
//		src = (char*)src + 1;
//	}
//	return(ret);
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	my_memcpy(arr2, arr1 + 3, 5 * sizeof(int));
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

//memmove的使用和模拟
// void * memmove ( void * destination, const void * source, size_t num );
//可以处理重叠的部分
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	memmove(arr1 + 2, arr1, 5 * sizeof(int));
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}

//void* my_memmove(void* dest, const void* src, size_t num)
//{
//	void* ret = dest;
//	assert(dest && src);
//	if (dest < src)
//	{
//		//前->后
//		while (num--) 
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else //后->前
//	{
//		while (num--) 
//		{
//			*((char*)dest + num) = *((char*)src + num);
//		}
//	}
//	return (ret);
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memmove(arr1 + 2, arr1, 5 * sizeof(int));
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}


//memset 函数的使⽤
// void * memset ( void * ptr, int value, size_t num );
//memset是⽤来设置内存的，将内存中的值 以字节为单位 设置成想要的内容。

//int main()
//{
//	char str[] = "hello world";
//	memset(str, 'x', 5);
//	printf(str);
//	return 0;
//}


//memcmp 函数的使⽤
//int memcmp ( const void * ptr1, const void * ptr2, size_t num );

//int main()
//{
//	char buffer1[] = "DWgaOtP12df0";
//	char buffer2[] = "DWGAOTP12DF0";
//	int n = memcmp(buffer1, buffer2, sizeof(buffer1));
//	if (n > 0)
//		printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
//	else if (n < 0)
//		printf("'%s' is less than '%s'.\n", buffer1, buffer2);
//	else
//		printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
//	return 0;
//}
